package com.weareint;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.google.common.collect.Lists;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TemplateCodeGenerator {

    public static void main(String[] args) {
        // 全局配置
        GlobalConfig globalConfig = new GlobalConfig();
    globalConfig
        .setAuthor("Auto Generator") // 设置作者
        .setActiveRecord(false) // 是否支持AR模式，模板中已此项去掉，所以无效
        // .setOutputDir("E:\\works\\taihu\\src\\main\\java") // 生成文件的路径
        .setOutputDir(
            "E:\\works\\quality_monitor\\quality-backend-server\\src\\main\\java") // 生成文件的路径
        .setFileOverride(true) // 文件覆盖
        .setOpen(false) // 生成完成之后是否打开输出目录
        .setIdType(IdType.AUTO) // 主键策略
        .setBaseResultMap(true)
        .setBaseColumnList(false)
        .setSwagger2(true)
        .setDateType(DateType.ONLY_DATE) // 所有日期类型都使用java.utils.Date
    ;

        // 数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig
                .setDbType(DbType.MYSQL)
//                .setUrl(
//                        "jdbc:mysql://192.168.15.31:3309/pkgs_mes?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai")
                .setUrl(
                        "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai")
                .setDriverName("com.mysql.jdbc.Driver")
                .setUsername("root")
                .setPassword("123456");

        // 策略配置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig
                .setCapitalMode(true) // 全局大写
                .setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
                .setEntityTableFieldAnnotationEnable(true) // 是否全部生成@TableField注释
                // .setExclude("user") // 排除某一个表
                .setInclude("printer")
                .setChainModel(false)
                .setEntityLombokModel(true)
                .setEntityColumnConstant(true)
                .setEntitySerialVersionUID(false)
                .setRestControllerStyle(true); // Controller是否Rest风格
        // strategyConfig.setInclude("t_user"); // 不指定表名就全部表都生成
        // strategyConfig.setTablePrefix("pkg_"); // 表前缀

        // 包名策略
        PackageConfig packageConfig = new PackageConfig();
        packageConfig
                .setParent("com.weareint.biz")
                .setEntity("entity")
                .setMapper("dao")
                .setService("service")
                .setServiceImpl("service.impl")
                .setController("controller")
                .setXml("dao.xml");

        // 模板配置
        TemplateConfig templateConfig = new TemplateConfig();
        // 添加自定义的模板
        templateConfig
                .setController("/templates/vms/Controller.java")
                .setServiceImpl("/templates/vms/ServiceImpl.java")
                .setService("/templates/vms/Service.java")
                .setEntity("/templates/vms/Entity.java");
        boolean genDTO = true; // 是否生成DTO
        templateConfig.disable(
//                 TemplateType.CONTROLLER // , // 不生成Controller
//                 TemplateType.SERVICE, // 不生成Service
//                 TemplateType.MAPPER // 不生成Mapper
//                 TemplateType.XML // 不生成Mapper.xml
                );

        // 自定义配置
        List<FileOutConfig> fileOutConfigs = new ArrayList<>();
        // 添加生成对应于Entity的DTO
        if (genDTO) {
            fileOutConfigs.add(
                    new FileOutConfig("/templates/vms/Dto.java.vm") {
                        @Override
                        public String outputFile(TableInfo tableInfo) {
                            return globalConfig.getOutputDir()
                                    + "/"
                                    + packageConfig.getParent().replaceAll("\\.", "/")
                                    + "/dto/"
                                    + tableInfo.getEntityName()
                                    + "DTO.java";
                        }
                    });
        }
        // 添加自定义配置中的参数
        InjectionConfig injectionConfig =
                new InjectionConfig() {
                    @Override
                    public void initMap() {
                        Map<String, Object> map = new HashMap<>();
                        map.put("lombok", true); // 启用lombok，在模板中使用${cfg.lombok}
                        map.put("dtoPkg", packageConfig.getParent() + ".dto"); // 生成DTO时的包路径
                        map.put("swaggerTagName", "业务接口");
                        map.put("servicePort", "8082");
                        map.put(
                                "commonCols",
                                Lists.newArrayList(
                                        "id",
                                        "create_time",
                                        "update_time",
                                        "creator",
                                        "updater")); // 所有实体都具有基础属性
                        map.put(
                                "withoutToEntityCols",
                                Lists.newArrayList(
                                        "create_time",
                                        "update_time",
                                        "creator",
                                        "updater")); // 所有实体都具有基础属性
                        map.put(
                                "entityExcludePkgs",
                                Lists.newArrayList(
                                        "com.baomidou.mybatisplus.annotation.TableId",
                                        "com.baomidou.mybatisplus.annotation.IdType",
                                        "java.io.Serializable")); // Entity中不引入的包
                        this.setMap(map);
                    }
                };
        injectionConfig.setFileOutConfigList(fileOutConfigs);

        // 开始生成
        AutoGenerator autoGenerator = new AutoGenerator();
        autoGenerator
                .setDataSource(dataSourceConfig)
                .setPackageInfo(packageConfig)
                .setTemplate(templateConfig)
                .setGlobalConfig(globalConfig)
                .setCfg(injectionConfig)
                .setStrategy(strategyConfig);
        autoGenerator.execute();
    }
}
